/**
 * 全局网络请求步骤：1、建立一个request.js文件  2、写出网络请求的方法  3、开放导出  4、在main.js引入  5、在main.js中添加实例  6、用this使用方法
 * 一般的GET请求，不带参数
 * @param {Object} url 接口地址
 * @param {Function} funSuccess 成功的回调
 * @param {Function} funComplete 请求结束的回调
 */
function get(url,funSuccess,funComplete){
	uni.showLoading({
		title: '加载中......',
		mask: false
	});
	uni.request({
		url: url,
		method: 'GET',
		sslVerify:false,
		header:{
			"content-type":"application/json;charset=UTF-8"
		},
		success: res => {
			funSuccess(res.data)
		},
		fail: err => {
			console.log(err);
		},
		complete: () => {
			uni.hideLoading();
			funComplete()
		}
	});
}

/**
 * GET请求，需要用户传递Header
 * @param {String} url 要请求的接口地址
 * @param {JSON} header 请求头，包含参数，若无参数可以使用get方法
 * @param {Function} funSuccess 成功的回调
 * @param {Function} funComplete 请求结束的回调，如果无需处理则传递一个空方法即可
 */
function getWithHeader(url,header,funSuccess,funComplete){
	uni.request({
		url,
		header,
		method: 'GET',
		sslVerify:false,
		success: res => {
			funSuccess(res.data)
		},
		fail: err => {
			console.log(err);
		},
		complete: () => {
			uni.hideLoading();
			funComplete()
		}
	});
}


/**
 * POST请求，需要用户传递Header
 * @param {String} url 要请求的接口地址
 * @param {JSON} data 要提交的数据
 * @param {Function} funSuccess 成功的回调
 * @param {Function} funComplete 请求结束的回调，如果无需处理则传递一个空方法即可
 */
function postParam(url,data,funSuccess,funComplete){
	uni.showLoading({
		title: '提交数据......',
		mask: false
	});
	uni.request({  //ureq
		url: url,
		header:{
			"Accept": "application/json; q=0.9, */*; q=0.1",  //品质因子q
			"Content-Type": "application/x-www-form-urlencoded;charset=UTF-8"
		},
		method: 'POST',
		sslVerify:false,
		data: data,
		success: res => funSuccess(res.data),
		fail: err => {
			console.log(err);
		},
		complete: () => {
			uni.hideLoading()
			funComplete()
		}
	});
}


/**
 * POST请求
 * @param {String} url 要请求的接口地址
 * @param {JSON} data 要提交的数据
 * @param {Function} funSuccess 成功的回调
 * @param {Function} funComplete 请求结束的回调，如果无需处理则传递一个空方法即可
 */
function post(url,data,funSuccess,funComplete){
	uni.showLoading({
		title: '提交数据..',
		mask: false
	});
	uni.request({
		url: url,
		method: 'POST',
		sslVerify:false,
		data: data,
		success: res => {
			funSuccess(res.data)
		},
		fail: err => {
			console.log(err);
		},
		complete: () => {
			uni.hideLoading();
			funComplete
		}
	});
}

/**
 * DELETE请求
 * @param {String} url 要请求的接口地址
 * @param {JSON} data 要提交的数据
 * @param {Function} funSuccess 成功的回调
 * @param {Function} funComplete 请求结束的回调，如果无需处理则传递一个空方法即可
 */
function deleteParams(url,data,funSuccess,funComplete){
	uni.request({  //ureq
		url: url,
		header:{
			"Accept": "application/json; q=0.9, */*; q=0.1",  //品质因子q
			"Content-Type": "application/x-www-form-urlencoded;charset=UTF-8"
		},
		method: 'DELETE',
		sslVerify:false,
		data: data,
		success: res => funSuccess(res.data),
		fail: err => {
			console.log(err);
		},
		complete: () => {
			funComplete()
		}
	});
}


/**
 * POST提交,上传文件到服务器，可同时提交表单数据
 * @param {String} url 服务器接口地址
 * @param {String} name 文件上传接口参数名，一般为file
 * @param {String} filePath 本地文件
 * @param {JSON} data 其他表单参数如user、password
 * @param {Function} funSuccess 上传成功的回调
 */
function postFile(url,name,filePath,data,funSuccess){
	uni.uploadFile({
		url,
		name,
		filePath,
		formData:data,
		success: res => funSuccess(res)
	})
}


/**
 * 同步的写法实现异步请求，asyns块内部代码是同步执行的，会等待await代码行的执行结果
 * 如果在lambda表达式内使用，async应该写在匿名函数参数的前面
 */
function requestAsync(url,data={},method='GET') {
	return new Promise((resolve,reject) => {
		uni.request({
			url: url,
			method: method,
			data: data,
			success: res => {
				resolve(res)
			},
			fail: err => {
				reject(err)
			},
			complete: () => {}
		});
	})
}

module.exports = {  //开放导出
	get,
	getWithHeader,  // header:getWithHeader
	postParam,
	post,
	deleteParams,
	postFile,
	requestAsync
}